#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
审核结果通知服务
审核结果通知功能实现
"""

import json
import logging
from typing import Dict, Any, Optional, List
from dataclasses import dataclass, asdict
from enum import Enum
from datetime import datetime

from jlpay.services.base_service import BaseService
from jlpay.services.org_service import JlpayOrgService
from jlpay.model.openmerch.notify.notify_audit_result import ApplyResultRecord, NotifyParam

# 创建全局logger
logger = logging.getLogger("jlpay.service.notify")


class SignType(Enum):
    """签名类型枚举"""
    SM3_WITH_SM2_WITH_DER = "SM3_WITH_SM2_WITH_DER"  # SM3+SM2+DER签名


class NotifyAuditResultService(BaseService):
    """审核结果通知服务"""

    def __init__(self, config):
        """
        初始化审核结果通知服务
        
        Args:
            config: OrgConfig实例
        """
        super().__init__(config)
        # 创建机构服务实例
        self.org_service = JlpayOrgService.builder().config(config).build()

    def get_api_url(self, request_class, api_path=None):
        """
        获取API URL
        
        Args:
            request_class: 请求类
            api_path: 接口路径
            
        Returns:
            完整的API URL
        """
        # 通知服务通常不需要具体的API URL，因为它是接收通知的
        # 但为了满足抽象方法的要求，返回一个默认值
        base_url = self.config.url.rstrip('/')
        return f"{base_url}/open/merch/notify/audit-result"

    def parse_notify(self, notify_param) -> Optional[ApplyResultRecord]:
        """
        解析审核结果通知
        
        Args:
            notify_param: 通知参数，可以是NotifyParam对象或字典
            
        Returns:
            申请结果记录，解析失败返回None
        """
        try:
            logger.info("开始解析审核结果通知")
            
            # 处理输入参数，支持字典和NotifyParam对象
            if isinstance(notify_param, dict):
                notify_data = notify_param
            elif hasattr(notify_param, 'to_dict'):
                notify_data = notify_param.to_dict()
            else:
                logger.error("不支持的notify_param类型")
                return None
            
            # 从body字段中解析业务数据
            body_str = notify_data.get('body', '{}')
            try:
                body_data = json.loads(body_str)
            except json.JSONDecodeError:
                logger.error("body字段不是有效的JSON格式")
                return None
            
            # 这里应该进行签名验证
            # TODO: 实现签名验证逻辑
            
            logger.info("审核结果通知解析成功")
            
            # 将解析结果转换为ApplyResultRecord对象
            if body_data:
                return ApplyResultRecord(**body_data)
            else:
                return None
            
        except Exception as e:
            logger.error("签名验证失败", exc_info=True)
            return None 